package com.eagle.common.sentinel.handler;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.eagle.common.core.constant.SystemErrorCodeEnum;
import com.eagle.common.core.support.ResultMessage;
import lombok.extern.slf4j.Slf4j;

/**
 * 通用的限流异常响应方式
 *
 * @author wcy
 * @date Created in 2021/4/21 15:54 <br>
 */
@Slf4j
public class SentinelCommonHandler {

    /**
     * 系统容灾功能被触发 包含（系统限流、或者降级异常等等异常）
     *
     * @param e
     * @return
     */
    public static ResultMessage blockException(BlockException e) {
        log.error("系统容灾功能被触发:{}", e);
        return ResultMessage.error(SystemErrorCodeEnum.SYSTEM_ERROR_B0200.getCode(),
                SystemErrorCodeEnum.SYSTEM_ERROR_B0200.getDescription());
    }

    /**
     * 系统限流
     *
     * @param e
     * @return
     */
    public static ResultMessage flowBlockException(BlockException e) {
        log.error("系统限流,当前访问太频繁:{}", e);
        return ResultMessage.error(SystemErrorCodeEnum.SYSTEM_ERROR_B0211.getCode(),
                SystemErrorCodeEnum.SYSTEM_ERROR_B0211.getDescription());
    }

    /**
     * 降级异常
     *
     * @param e
     * @return
     */
    public static ResultMessage degradeBlockException(BlockException e) {
        log.error("系统功能降级:{}", e);
        return ResultMessage.error(SystemErrorCodeEnum.SYSTEM_ERROR_B0220.getCode(),
                SystemErrorCodeEnum.SYSTEM_ERROR_B0220.getDescription());
    }

    /**
     * Fallback 函数，函数签名与原函数一致或加一个 Throwable 类型的参数.
     *
     * @param e
     * @return
     */
    public static ResultMessage fallback(Throwable e) {
        log.error("系统执行出错:{}", e);
        return ResultMessage.error(SystemErrorCodeEnum.SYSTEM_ERROR_B0001.getCode(),
                SystemErrorCodeEnum.SYSTEM_ERROR_B0001.getDescription());
    }
}
